package com.tico.common.utils;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

/***
 *
 * @author LFM
 *May 2, 2018
 *TimmerUtils.java
 *
 *<p>方法说明：常用操作time 时间进行换算的方法归�?
</p>
 */
public class TimmerUtils {
    private static TimmerUtils instance;

    private TimmerUtils() {

    }

    public static TimmerUtils getInstance() {
        if (instance == null) {
            instance = new TimmerUtils();
        }
        return instance;
    }

    /**
     * 指定日期加上天数后的日期
     *
     * @param num     为增加的天数
     * @param newDate 创建时间
     * @return
     * @throws ParseException
     */
    public static String plusDay(int num, String newDate) throws ParseException {
        System.out.println("当前日期是" + newDate);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 将字符串的日期转为Date类型，ParsePosition(0)表示从第一个字符开始解析
        Date date = sdf.parse(newDate, new ParsePosition(0));
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // add方法中的第二个参数n中，正数表示该日期后n天，负数表示该日期的前n天
        calendar.add(Calendar.DATE, num);
        Date date1 = calendar.getTime();
        String out = sdf.format(date1);
        System.out.println("增加了" + num + "天之后的日期是" + out);
        return out;
    }

    /***
     *
     * @param bigDate
     * @param smallDate
     * @return 返回两个时间的天数间
     */
    public static int timeDifference(Date bigDate, Date smallDate) {
        //将两个时间对象转换成Calendard对象
        Calendar can1 = Calendar.getInstance();
        can1.setTime(bigDate);
        Calendar can2 = Calendar.getInstance();
        can2.setTime(smallDate);
        //拿出两个年份
        int year1 = can1.get(Calendar.YEAR);
        int year2 = can2.get(Calendar.YEAR);
        //天数
        int days = 0;
        Calendar can = null;
        //如果can1 < can2
        //减去小的时间在这�?��已经过了的天�?
        //加上大的时间已过的天�?
        if (can1.before(can2)) {
            days -= can1.get(Calendar.DAY_OF_YEAR);
            days += can2.get(Calendar.DAY_OF_YEAR);
            can = can1;
        } else {
            days -= can2.get(Calendar.DAY_OF_YEAR);
            days += can1.get(Calendar.DAY_OF_YEAR);
            can = can2;
        }
        for (int i = 0; i < Math.abs(year2 - year1); i++) {
            //获取小的时间当前年的总天�?
            days += can.getActualMaximum(Calendar.DAY_OF_YEAR);
            //再计算下�?���?
            can.add(Calendar.YEAR, 1);
        }
        return days;
    }

    /***
     * 获取当前时间
     * @return
     */
    public static String getNowTime() {
        Date day = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return df.format(day).toString();
    }

    /***
     * 获取当前时间 精确到毫秒
     * @return
     */
    public static String getNowTimeSSS() {
        Date day = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        return df.format(day).toString();
    }

    /***
     * 获取当前时间 精确到毫秒 字符串类型 无日期格式
     * @return
     */
    public static String getNowTimeSSS_str() {
        Date day = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return df.format(day).toString();
    }

    /**
     * Date转String 里面有三种定义的格式可以根据自己想要得进行再次封�?
     *
     * @param date
     * @return
     */
    public static String dateToString(Date date) {
//    	 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//    	 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd�?HH:mm:ss");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = sdf.format(date);
        return dateStr;
    }

    /***
     * 传进的参数和今天做对�? 如果是小于今�?也就是昨�?返回before 如果大于今天是明�?返回after
     * 异常处理 返回null
     * @param myString
     * @return
     */
    public static String checkNowTime(String myString) {
        Date nowdate = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
        Date d;
        try {
            d = sdf.parse(myString);
            boolean flag = d.before(nowdate);
            if (flag) {
//				System.out.print("早于今天"); //时间 比 当前时间 小
                return "before";
            } else {
//				System.out.print("晚于今天");//时间 比 当前时间 大
                return "after";
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

    /**
     * Date转为String(yyyy-MM-dd HH:mm:ss)
     *
     * @param time
     * @return
     */
    public static String DateToString(Date time) {
        String dateStr = "";
        Date date = new Date();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            dateStr = dateFormat.format(time);
            System.out.println(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dateStr;
    }

    /**
     * String(yyyy-MM-dd HH:mm:ss)转10位时间戳
     *
     * @param time
     * @return
     */
    public static Integer StringToTimestamp(String time) {

        int times = 0;
        try {
            times = (int) ((Timestamp.valueOf(time).getTime()) / 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (times == 0) {
            System.out.println("String转10位时间戳失败");
        }
        return times;
    }

    /**
     * String(yyyy-MM-dd HH:mm:ss)10位时间戳转 date
     *
     * @param time
     * @return
     */
    public static Date TimestampToDate(int time) {

        String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time * 1000));
        System.out.println("10位数的时间戳（秒）--->Date:" + result1);
        Date date1 = new Date(time * 1000);
        return date1;
    }

    /**
     * string 转 Date
     *
     * @param time
     * @return
     */
    public static Date StringToDate(String time) {
        Date date = null;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            date = simpleDateFormat.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    //	/**
//	 * 对比两个日期的大小
//	 * @param DATE1
//	 * @param DATE2
//	 * @return
//	 */
//	public static int compare_date(String DATE1, String DATE2) {
//
//
//		DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
//		try {
//			Date dt1 = df.parse(DATE1);
//			Date dt2 = df.parse(DATE2);
//			if (dt1.getTime() > dt2.getTime()) {
//				System.out.println("dt1 >dt2前");
//				return 1;
//			} else if (dt1.getTime() < dt2.getTime()) {
//				System.out.println("dt1<dt2后");
//				return -1;
//			} else {
//				return 0;
//			}
//		} catch (Exception exception) {
//			exception.printStackTrace();
//		}
//		return 0;
//	}
    public static long DateToDateMinute(Date getOrderTime) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long currentTime = System.currentTimeMillis();
        //从对象中拿到时间
        long createTime = 0;
        try {
            createTime = df.parse(df.format(getOrderTime)).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        long diff = (createTime - currentTime) / 1000 / 60;
        System.out.println("当前系统时间为：" + currentTime + "传入时间为：" + createTime + "两个时间差为：" + diff);
        return diff;
    }

    public static String addDateMinut(String day, int x)//返回的是字符串型的时间，输入的
    //是String day, int x
    {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 24小时制
        //引号里面个格式也可以是 HH:mm:ss或者HH:mm等等，很随意的，不过在主函数调用时，要和输入的变
        //量day格式一致
        Date date = null;
        try {
            date = format.parse(day);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        if (date == null)
            return "";
//		System.out.println("front:" + format.format(date)); //显示输入的日期
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MINUTE, x);// 24小时制
        date = cal.getTime();
//		System.out.println("after:" + format.format(date));  //显示更新后的日期
        cal = null;
        return format.format(date);

    }

    public static long getStringToDate(String time) {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        try {
            date = sf.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date.getTime();
    }

    /**
     * 判断时间是否在时间段内
     *
     * @param nowTime
     * @param beginTime
     * @param endTime
     * @return
     */
    public static boolean belongCalendar(Date nowTime, Date beginTime,
                                         Date endTime) {
        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(beginTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }
    }
    public static long getTime(String oldTime,String newTime) throws ParseException {

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long NTime =df.parse(newTime).getTime();
        //从对象中拿到时间
        long OTime = df.parse(oldTime).getTime();
        long diff=(NTime-OTime)/1000/60;
        return diff;
    }
    public static String GMTEight(String time){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = format.format(TimmerUtils.StringToDate(time));
        format.setTimeZone(TimeZone.getTimeZone("GMT+0"));
        Date date = null;
        try {
            date = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        format.setTimeZone(TimeZone.getTimeZone("GMT-8"));
        dateStr = format.format(date);
        System.out.println(dateStr);
        return  dateStr;
    }


    public static void main(String[] args) {
        long stringToDate = 0;
        try {
            stringToDate = TimmerUtils.getTime("2020-09-16 16:30:00","2020-09-16 16:38:00");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.printf("" + stringToDate);
    }
}
